package cn.h8k.hj212.plugin;

import java.util.List;
import java.util.Map;

/**
 * 监测因子插件接口
 * 允许开发者扩展支持新的监测因子类型
 * 
 * @author HJ212 Team
 * @since 1.0
 */
public interface MonitoringFactorPlugin {
    
    /**
     * 获取插件名称
     * @return 插件名称
     */
    String getName();
    
    /**
     * 获取插件版本
     * @return 插件版本
     */
    String getVersion();
    
    /**
     * 获取支持的监测因子代码列表
     * @return 监测因子代码列表
     */
    List<String> getSupportedFactorCodes();
    
    /**
     * 获取支持的系统编号列表
     * @return 系统编号列表
     */
    List<String> getSupportedSystemTypes();
    
    /**
     * 验证监测因子数据
     * @param factorCode 监测因子代码
     * @param value 监测值
     * @param flag 数据标识
     * @return 验证结果
     */
    ValidationResult validateFactor(String factorCode, Object value, String flag);
    
    /**
     * 转换监测因子数据
     * @param factorCode 监测因子代码
     * @param value 原始值
     * @return 转换后的值
     */
    Object transformValue(String factorCode, Object value);
    
    /**
     * 获取监测因子的元数据信息
     * @param factorCode 监测因子代码
     * @return 元数据信息
     */
    FactorMetadata getFactorMetadata(String factorCode);
    
    /**
     * 获取监测因子的单位信息
     * @param factorCode 监测因子代码
     * @return 单位信息
     */
    String getFactorUnit(String factorCode);
    
    /**
     * 获取监测因子的描述信息
     * @param factorCode 监测因子代码
     * @return 描述信息
     */
    String getFactorDescription(String factorCode);
    
    /**
     * 初始化插件
     * @param config 配置参数
     */
    void initialize(Map<String, Object> config);
    
    /**
     * 销毁插件资源
     */
    void destroy();
    
    /**
     * 验证结果类
     */
    class ValidationResult {
        private final boolean valid;
        private final String message;
        private final String errorCode;
        
        public ValidationResult(boolean valid, String message, String errorCode) {
            this.valid = valid;
            this.message = message;
            this.errorCode = errorCode;
        }
        
        public static ValidationResult success() {
            return new ValidationResult(true, null, null);
        }
        
        public static ValidationResult failure(String message, String errorCode) {
            return new ValidationResult(false, message, errorCode);
        }
        
        public boolean isValid() {
            return valid;
        }
        
        public String getMessage() {
            return message;
        }
        
        public String getErrorCode() {
            return errorCode;
        }
    }
    
    /**
     * 监测因子元数据类
     */
    class FactorMetadata {
        private final String code;
        private final String name;
        private final String unit;
        private final String description;
        private final Class<?> valueType;
        private final Double minValue;
        private final Double maxValue;
        private final Integer precision;
        
        public FactorMetadata(String code, String name, String unit, String description, 
                            Class<?> valueType, Double minValue, Double maxValue, Integer precision) {
            this.code = code;
            this.name = name;
            this.unit = unit;
            this.description = description;
            this.valueType = valueType;
            this.minValue = minValue;
            this.maxValue = maxValue;
            this.precision = precision;
        }
        
        // Getters
        public String getCode() { return code; }
        public String getName() { return name; }
        public String getUnit() { return unit; }
        public String getDescription() { return description; }
        public Class<?> getValueType() { return valueType; }
        public Double getMinValue() { return minValue; }
        public Double getMaxValue() { return maxValue; }
        public Integer getPrecision() { return precision; }
    }
}
